package pe.com.cotelasa.scp.seguridad.modelo;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.inject.Inject;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

import pe.com.cotelasa.common.servicios.IServicioCorreo;
import pe.com.cotelasa.scp.dominio.excepcion.ModelExcepcion;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.scp.dominio.service.IServicioEmpresa;
import pe.com.cotelasa.scp.dominio.service.IServicioUsuarioEmpresa;
import pe.com.cotelasa.scp.entidad.Empresa;
import pe.com.cotelasa.seguridad.common.util.Constantes;
import pe.com.cotelasa.seguridad.controlador.backingBean.BKSession;
import pe.com.cotelasa.seguridad.dominio.servicio.IServiceRol;
import pe.com.cotelasa.seguridad.dominio.servicio.IServiceUsuario;
import pe.com.cotelasa.seguridad.dominio.servicio.IServicioEnviarCorreo;
import pe.com.cotelasa.seguridad.entidad.Rol;
import pe.com.cotelasa.seguridad.entidad.Usuario;
import pe.com.cotelasa.seguridad.entidad.UsuarioEmpresa;

@Component("usuarioModel")
public class UsuarioModelImpl implements UsuarioModel {

    @Inject
    @Qualifier("servicioUsuario")
    private IServiceUsuario serviceUsuario;
    @Inject
    private IServiceRol serviceRol;
    @Inject
    private IServicioEmpresa servicioEmpresa;
    @Inject
    private IServicioUsuarioEmpresa servicioUsuarioEmpresa;
    @Autowired
    private IServicioEnviarCorreo servicioEnviarCorreo;
    @Autowired
    @Qualifier("servicioCorreo")
    private IServicioCorreo servicioCorreo;

//    @Autowired
//    private BKSession bkSession;
    @Override
    public List<Usuario> buscarListaUsuariosActivos(Usuario beanEmpresa)
            throws ModelExcepcion {
        try {
            return serviceUsuario.obtenerListaUsuarios(beanEmpresa);
        } catch (ServiceException e) {
            throw new ModelExcepcion(e);
        }
    }

    @Override
    public void guardarUsuario(Usuario beanUsuario, List<Empresa> listaBeanEmpresa, boolean esCodificarContrasena) throws ModelExcepcion {
        try {
            serviceUsuario.guardarUsuario(beanUsuario, listaBeanEmpresa, esCodificarContrasena);
        } catch (ServiceException e) {
            throw new ModelExcepcion(e);
        }

    }

    @Override
    public void actualizarUsuario(Usuario beanUsuario, List<Empresa> listaBeanEmpresa, boolean esCodificarContrasena) throws ModelExcepcion {
        try {
            serviceUsuario.guardarUsuario(beanUsuario, listaBeanEmpresa,esCodificarContrasena);
        } catch (ServiceException e) {
            throw new ModelExcepcion(e);
        }
    }

    @Override
    public void eliminarUsuario(Integer idUsuario) throws ModelExcepcion {
        try {
            serviceUsuario.eliminacionLogica(serviceUsuario.obtenerUsuarioPorId(idUsuario));
        } catch (ServiceException e) {
            throw new ModelExcepcion(e);
        }

    }

    @Override
    public Object validarUsuario(Usuario beanUsuario) throws ModelExcepcion {
        Map<String, Object> datos = new HashMap<String, Object>();

        try {
            Usuario usuario = serviceUsuario.validarUsuarioPorCredencialesActivo(beanUsuario.getUsuario());
            if (usuario == null) {
                datos.put("valido", true);
                datos.put("mensaje", "OK");

            } else {

                if (beanUsuario.getId() == null || !usuario.equals(beanUsuario)) {

                    datos.put("valido", false);
                    datos.put("mensaje", "Este usuario ya está regitrado.");
                } else {
                    datos.put("valido", true);
                    datos.put("mensaje", "OK");
                }

            }

        } catch (ServiceException e) {
            throw new ModelExcepcion(e);
        }

        return datos;
    }

    @Override
    public Usuario obtenerUsuario(Integer idUsuario) throws ModelExcepcion {
        try {
            return serviceUsuario.obtenerUsuarioPorId(idUsuario);
        } catch (ServiceException e) {
            throw new ModelExcepcion(e);
        }
    }

    @Override
    public List<Rol> listaRolesActivos() throws ModelExcepcion {
        try {
            return (List<Rol>) serviceRol.obtenerListaRolesActivos();
        } catch (ServiceException e) {
            throw new ModelExcepcion(e);
        }
    }

    @Override
    public List<Empresa> lisaEmpresasActivas() throws ModelExcepcion {
        try {
            return (List<Empresa>) servicioEmpresa.listarEmpresasActivas();
        } catch (ServiceException e) {
            throw new ModelExcepcion(e);
        }
    }

    @Override
    public List<List<Empresa>> obtenerDualListasEmpresasPorUsuario(
            Integer idUsuario) throws ModelExcepcion {
        List<Empresa> listaEmpresasPorUsuario = new ArrayList<Empresa>();
        List<Empresa> listaEmpresaActivas = null;
        try {
            listaEmpresasPorUsuario = servicioEmpresa.obtenerListaEmpresasPorUsuario(idUsuario);
            System.out.println("empresas activas: " + listaEmpresasPorUsuario);
            listaEmpresaActivas = (List<Empresa>) servicioEmpresa.listarEmpresasActivas();
            System.out.println("empresas: " + listaEmpresaActivas);
            for (Empresa empresa : listaEmpresasPorUsuario) {
                listaEmpresaActivas.remove(empresa);
            }
            List<List<Empresa>> lista = new ArrayList<List<Empresa>>();
            lista.add(listaEmpresaActivas);
            lista.add(listaEmpresasPorUsuario);
            return lista;
        } catch (ServiceException e) {
            throw new ModelExcepcion(e);
        }

    }

    @Override
    public void enviarCorreoUsuario(Usuario beanUsuario, String nuevaContracena)
            throws ModelExcepcion {
        try {
            servicioEnviarCorreo.enviarCorreoUsuario(beanUsuario.getEmail(), nuevaContracena, beanUsuario.getUsuario());
        } catch (ServiceException e) {
            throw new ModelExcepcion(e);
        }
    }
}
